package dht.tools;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;

import dht.data.DhtData;
import dht.data.TabBigInteger;
import dht.node.Node;

/**
 * Md5Impl fournit les outils de generation de hash MD5 representant les coordonnees d'un point.
 * @author bouceka
 *
 */

public class Md5Impl {
	
	/**
	 * Genere le hash MD5 de la string szChaine.
	 * 
	 * @param szChaine
	 *                 La string qu'on veut hasher.
	 * @return
	 *         Le BigInteger qui represente le hash MD5.
	 */
	public static BigInteger getHashMd5(String szChaine){
		
		MessageDigest md = null;
		BigInteger res = null;
		
		try {
			md = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			System.err.println("tools.Md5Impl : algo MD5 non trouve.");
			e.printStackTrace();
		}
		
		res = new BigInteger(md.digest(szChaine.getBytes()));
		
		if((res.compareTo(Node.B_PLUS_INF) > 0) || (res.compareTo(Node.B_MOINS_INF) < 0)){
			System.out.println("Erreur critere !\n");
			return null;
		}
			
		return res;
	}
	/**
	 * Fonction qui nous permet de retourner les coordonnées en fonction
	 * de la valeur de la donnee
	 * @param dt la donnee
	 * @return le tableau de coordonnées
	 */
	public static TabBigInteger creerTab(DhtData<Integer> dt) {
		TabBigInteger tb=new TabBigInteger(Node.NB_DIMENSION);
		for (int i=0;i<Node.NB_DIMENSION;i++) {
			int j=dt.getValue()+i;
			tb.setValue(i, Md5Impl.getHashMd5(j+""));
		}
		return tb;
	}

	/**
	 * Fonction qui nous permet de retourner les coordonnées en fonction
	 * des criteres
	 * @param criteres
	 * @return le tableau de coordonnées
	 */
	public static TabBigInteger creerTab(ArrayList<String> criteres) {
		TabBigInteger tb=new TabBigInteger(Node.NB_DIMENSION);
		for (int i=0;i<Node.NB_DIMENSION;i++) {
			tb.setValue(i, Md5Impl.getHashMd5(criteres.get(i)));
		}
		return tb;
	}
}
